package org.huangrui.spark.scala.core.rdd.operate.action

import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author hr
 * @Create 2024-10-18 8:26 
 */
object Spark02_Operate_Action_collect {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val sc = new SparkContext(conf)
    val rdd = sc.parallelize(List(1, 4, 2, 3), 2)
    // sc.textFile("hdfs://xxxxx");
    // Spark的计算全部都是在Executor端执行
    // TODO
    //    Spark在编写代码时，调用转换算子，并不会真正执行，因为只是在Driver端组合功能
    //    所以当前的代码其实就是在Driver端执行
    //    所以当前main方法也称之为driver方法，当前main线程，也称之Driver线程。
    //    转换算子中的逻辑代码是在Executor端执行的。并不会在Driver端调用和执行。
    //    RDD封装的逻辑其实就是转换算子中的逻辑代码。
    val mapRdd = rdd.map((x: Int) => {
      println("****************************")
      x * 2
    })
    // TODO collect方法就是行动算子，会触发Job的执行
    //      collect方法就是将Executor端执行的结果按照分区的顺序拉取（采集）回到Driver端, 将结果组合成集合对象
    //      collect方法可能会导致多个Executor的大量数据拉取到Driver端，导致内存溢出，所以生成环境慎用
    mapRdd.collect().foreach(println)

    sc.stop()
  }
}
